home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EuroCD 3
/
EuroCD 3.iso
/
Programming
/
vbcc
/
supp.h
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-24
|
13KB
|
449 lines
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <stddef.h>
#include <stdarg.h>
#include <ctype.h>
/* typenames */
#define CHAR 1
#define SHORT 2
#define INT 3
#define LONG 4
#define FLOAT 5
#define DOUBLE 6
#define VOID 7
#define POINTER 8
#define ARRAY 9
#define STRUCT 10
#define UNION 11
#define ENUM 12
#define FUNKT 13
#define NQ 15 /* f&NQ gives type without any qualifiers */
#define NU 31 /* f&NU gives type without any qualifiers but UNSIGNED */
/* operations on bit-vectors */
#define BSET(array,bit) (array)[(bit)/CHAR_BIT]|=1<<((bit)%CHAR_BIT)
#define BCLR(array,bit) (array)[(bit)/CHAR_BIT]&=~(1<<((bit)%CHAR_BIT))
#define BTST(array,bit) ((array)[(bit)/CHAR_BIT]&(1<<((bit)%CHAR_BIT)))
/* type-qualifiers */
#define UNSIGNED 16
#define CONST 64
#define VOLATILE 128
#define UNCOMPLETE 256
#define STRINGCONST 512
/* macro for internal errors */
#define ierror(a) error(-1,(a),__LINE__,FILE_)
/* this header is provided by the code generator */
#include "machine.h"
struct fi_list {
char *identifier;
int class;
int type;
};
/* additional information for functions; used by the optimizer */
struct function_info{
struct IC *first_ic; /* inline copy of function starts here */
struct IC *last_ic; /* " " " ends here */
struct Var *vars; /* pointer to list of vars of that function */
char *inline_asm; /* pointer to code for inline assembler */
char *translation_unit; /* string as ID for the translation-unit */
unsigned long flags; /* misc flags, see above */
int unresolved_calls; /* number of function-calls not yet resolved */
struct fi_list *calls; /* list of functions called by that function */
/* registers used and modified by that function */
unsigned char regs_used[(MAXR+CHAR_BIT)/CHAR_BIT];
unsigned char regs_modified[(MAXR+CHAR_BIT)/CHAR_BIT];
/* variables used and modified by this function */
struct fi_list *used;
struct fi_list *modified;
};
/* struct for types. */
struct Typ{
int flags; /* see above */
struct Typ *next;
struct struct_declaration *exact; /* used for STRUCT/UNION/FUNKT */
zlong size; /* used for ARRAY */
};
#define TYPS sizeof(struct Typ)
struct Var{
int storage_class; /* see below */
int reg; /* Var is assigned to this hard-reg */
int priority; /* Priority to be used in simple_regs() */
int flags; /* see below */
char *identifier; /* name of the variable */
int nesting; /* can be freely used by the frontend */
int index; /* used by the optimizer */
zlong offset; /* offset relative to the stack frame */
struct Typ *vtyp; /* type of the variable */
struct const_list *clist; /* initialized? */
struct Var *next; /* pointer to next variable */
struct function_info *fi; /* used by the optimizer */
struct Var *inline_copy; /* used for function-inlining */
};
/* available storage-classes */
#define AUTO 1 /* var is allocated on the stack */
#define REGISTER 2 /* basically the same as AUTO (C-only) */
#define STATIC 3 /* var is static but has no external linkage */
#define EXTERN 4 /* var is static and has external linkage */
#define TYPEDEF 5 /* C-only */
/* available flags in struct Var */
#define USEDASSOURCE 1 /* the var has been read */
#define USEDASDEST 2 /* the var has been written */
#define DEFINED 4 /* the var has been defined (i.e. storage will
be allocated in the current file) */
#define USEDASADR 8 /* the address of the var has been taken */
#define GENERATED 16 /* code for static vars has been generated */
#define CONVPARAMETER 32
#define TENTATIVE 64 /* C-only */
#define USEDBEFORE 128 /* used by the optimizer */
#define INLINEV 256 /* " " */
#define PRINTFLIKE 512 /* C-only */
#define SCANFLIKE 1024 /* C-only */
#define NOTTYPESAFE 2048 /* used by the optimizer */
#define DNOTTYPESAFE 4096 /* " " */
#define REGPARM 8192 /* the var is a register parameter */
#define SLSIZE 32 /* realloc struct_lists in those steps */
/* These structs are used to describe members of STRUCT/UNION or */
/* parameters of FUNKT. Some of the entries in struct_list are not */
/* relevant for both alternatives. */
struct struct_declaration{
int count; /* number of members/parameters */
struct struct_declaration *next;
struct struct_list (*sl)[];
};
/* C-only */
struct struct_list{
char *identifier; /* name of the struct/union-tag */
struct Typ *styp; /* type of the member/parameter */
int storage_class; /* storage-class of function-parameter */
int reg; /* register to pass function-parameter */
};
/* This struct represents objects in the intermediate code. */
struct obj{
int flags; /* see below */
int reg; /* number of reg if flags® */
struct Var *v;
struct AddressingMode *am;
union atyps{
zchar vchar;
zuchar vuchar;
zshort vshort;
zushort vushort;
zint vint;
zuint vuint;
zlong vlong;
zulong vulong;
zfloat vfloat;
zdouble vdouble;
zpointer vpointer;
}val;
};
/* Available flags in struct obj. */
/* KONST muss immer am kleinsten sein, um beim Swappen */
/* fuer available_expressions und Konstanten nach */
/* rechts nicht in eine Endlosschleife zu kommen. */
#define KONST 1 /* The object is a constant. Its value is stored in */
/* val. */
#define VAR 2 /* The object is a variable (stored in v). */
#define SCRATCH 8 /* The object is a temporary. */
#define STACK 16 /* obsolete */
#define DREFOBJ 32 /* The object must be dereferenced. */
#define REG 64 /* The object is contained in a hardware register. */
#define VARADR 128 /* The object is the address of a static variable. */
#define DONTREGISTERIZE 256 /* Do not put this object into a register. */
/* The quads in the intermediate code. */
struct IC{
struct IC *prev; /* pointer to the next IC */
struct IC *next; /* pointer to the previous IC */
int code; /* see below */
int typf; /* usually type of the operands, see interface.doc */
int defindex; /* used by optimizer */
int expindex;
int copyindex;
int change_cnt;
int use_cnt;
int line; /* corresponding line in source file (or 0) */
struct varlist *change_list; /* used by optimizer */
struct varlist *use_list;
struct obj q1; /* source 1 */
struct obj q2; /* source 2 */
struct obj z; /* target */
char *file; /* filename of the source file */
};
#define ICS sizeof(struct IC)
/* Available codes for struct IC. See interface.doc. */
#define KOMMA 1
#define ASSIGN 2
#define ASSIGNADD 3
#define ASSIGNSUB 4
#define ASSIGNMULT 5
#define ASSIGNDIV 6
#define ASSIGNMOD 7
#define ASSIGNAND 8
#define ASSIGNXOR 9
#define ASSIGNOR 10
#define ASSIGNLSHIFT 11
#define ASSIGNRSHIFT 12
#define COND 13
#define LOR 14
#define LAND 15
#define OR 16
#define XOR 17
#define AND 18
#define EQUAL 19
#define INEQUAL 20
#define LESS 21
#define LESSEQ 22
#define GREATER 23
#define GREATEREQ 24
#define LSHIFT 25
#define RSHIFT 26
#define ADD 27
#define SUB 28
#define MULT 29
#define DIV 30
#define MOD 31
#define NEGATION 32
#define KOMPLEMENT 33
#define PREINC 34
#define POSTINC 35
#define PREDEC 36
#define POSTDEC 37
#define MINUS 38
#define CONTENT 39
#define ADDRESS 40
#define CAST 41
#define CALL 42
#define INDEX 43
#define DPSTRUCT 44
#define DSTRUCT 45
#define IDENTIFIER 46
#define CEXPR 47
#define STRING 48
#define MEMBER 49
#define CONVCHAR 50
#define CONVSHORT 51
#define CONVINT 52
#define CONVLONG 53
#define CONVFLOAT 54
#define CONVDOUBLE 55
#define CONVVOID 56
#define CONVPOINTER 57
#define CONVUCHAR 58
#define CONVUSHORT 59
#define CONVUINT 60
#define CONVULONG 61
#define ADDRESSA 62
#define FIRSTELEMENT 63
#define PMULT 64
#define ALLOCREG 65
#define FREEREG 66
#define PCEXPR 67
#define TEST 68
#define LABEL 69
#define BEQ 70
#define BNE 71
#define BLT 72
#define BGE 73
#define BLE 74
#define BGT 75
#define BRA 76
#define COMPARE 77
#define PUSH 78
#define POP 79
#define ADDRESSS 80
#define ADDI2P 81
#define SUBIFP 82
#define SUBPFP 83
#define PUSHREG 84
#define POPREG 85
#define POPARGS 86
#define SAVEREGS 87
#define RESTOREREGS 88
#define ILABEL 89
#define DC 90
#define ALIGN 91
#define COLON 92
#define GETRETURN 93
#define SETRETURN 94
#define MOVEFROMREG 95
#define MOVETOREG 96
#define NOP 97
#define arith(c) ((c)>=CHAR&&(c)<=DOUBLE)
extern char *typname[];
extern zlong sizetab[16];
extern char *storage_class_name[];
extern char *ename[];
extern zlong align[16],maxalign;
/* an empty string */
extern char *empty;
extern zchar vchar; extern zuchar vuchar;
extern zshort vshort; extern zushort vushort;
extern zint vint; extern zuint vuint;
extern zlong vlong; extern zulong vulong;
extern zfloat vfloat; extern zdouble vdouble;
extern zpointer vpointer;
#ifndef DEBUG
extern int DEBUG;
#endif
/* used by the optimizer */
struct varlist{
struct Var *v;
int flags;
};
#define VLS sizeof(struct varlist)
extern struct IC *first_ic,*last_ic;
extern int regs[MAXR+1],regsa[MAXR+1],regused[MAXR+1],regscratch[MAXR+1];
extern zlong regsize[MAXR+1];
extern struct Typ *regtype[MAXR+1];
extern struct Var *regsv[MAXR+1];
extern char *regnames[];
extern int label,return_label;
/* The structures used for available options of the code generator. */
union ppi {char *p;long l;void (*f)(char *);};
#define USEDFLAG 1
#define STRINGFLAG 2
#define VALFLAG 4
#define FUNCFLAG 8
extern int g_flags[MAXGF];
extern char *g_flags_name[MAXGF];
extern union ppi g_flags_val[MAXGF];
extern zlong max_offset;
extern int function_calls;
/* Das haette ich gern woanders */
struct node{
int flags,lvalue,sidefx;
struct Typ *ntyp;
struct node *left;
struct node *right;
struct argument_list *alist;
char *identifier;
struct const_list *cl;
union atyps val;
struct obj o;
};
typedef struct node *np;
#define NODES sizeof(struct node)
struct const_list{
union atyps val;
np tree;
struct const_list *other,*next;
};
#define CLS sizeof(struct const_list)
extern zlong t_min[];
extern zulong t_max[];
extern zlong char_bit;
extern char cg_copyright[];
extern int goto_used;
extern int ic_count;
extern int only_inline;
extern int multiple_ccs;
extern int float_used;
extern struct IC *err_ic;
extern long maxoptpasses,optflags,inline_size,unroll_size;
extern long noaliasopt,fp_assoc;
extern struct Var *vl1,*vl2,*vl3;
extern int fline;
extern char errfname[FILENAME_MAX+1];
/* functions which must be provided by the frontend */
extern void add_IC(struct IC *);
extern void error(int,...);
extern struct Var *add_tmp_var(struct Typ *);
extern void raus(void);
/* functions provided by supp.c */
extern void free_IC(struct IC *);
extern void insert_IC(struct IC *,struct IC *);
extern void pric(FILE *,struct IC *);
extern void pric2(FILE *,struct IC *);
extern void probj(FILE *,struct obj *,int);
extern void printzl(FILE *,zlong);
extern void printzul(FILE *,zulong);
extern void printzd(FILE *,zdouble);
extern void printval(FILE *,union atyps *,int,int);
extern void insert_const2(union atyps *,int);
extern void prd(FILE *,struct Typ *);
extern void freetyp(struct Typ *);
extern struct Typ *clone_typ(struct Typ *);
extern zlong szof(struct Typ *);
extern zlong falign(struct Typ *);
extern void eval_const(union atyps *,int);
extern struct function_info *new_fi(void);
extern void free_fi(struct function_info *);
extern void optimize(long, struct Var *);
extern void remove_IC(struct IC *);
extern void *mymalloc(size_t);
extern void simple_regs(void);
/* functions provided by the code generator */
extern int regok(int,int,int);
extern int freturn(struct Typ *);
extern void gen_code(FILE *,struct IC *,struct Var *,zlong);
extern int init_cg(void);
extern void cleanup_cg(FILE *);
extern int dangerous_IC(struct IC *);
extern void gen_dc(FILE *,int,struct const_list *);
extern void gen_ds(FILE *,zlong,struct Typ *);
extern void gen_var_head(FILE *,struct Var *);
extern void gen_align(FILE *,zlong);
extern int shortcut(int, int);
extern int must_convert(np,int);
/* additional declarations for targets which pass arguments in */
/* registers by default. */
#ifdef HAVE_REGPARMS
extern struct reg_handle empty_reg_handle;
extern int reg_parm(struct reg_handle *, struct Typ *);
#endif